﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Windows.Forms;

namespace GestionBudget.Objects
{
    public class Categorie : ObjectPersistent
    {
        private const string NOM_FICHIER_XML = "categories.xml";

        protected int identifiant;
        protected string description;
        private List<SousCategorie> listeSousCategorie;


        public static Categorie Creer()
        {
            Categorie nouvelleCategorie = new Categorie();
            DictionnaireDonnees.ListeCategories.Add(nouvelleCategorie);
            return nouvelleCategorie;
        }


        protected Categorie()
        {
            this.description = "Donnez une description";
            SetEstNouveauTrue();
        }

        protected Categorie(string identifiant, string description)
        {
            this.identifiant = Convert.ToInt32(identifiant);
            this.description = description;
        }

        public  Categorie Self
        {
            get { return this; }
        }

        public int Identifiant
        {
            get { return identifiant; }
        }

        public string Description
        {
            get 
            { 
                return (!string.IsNullOrEmpty(description) ? description : String.Empty); 
            }

            set 
            {
                if (description != value)
                {
                    SetEstModifieTrue();
                }
                description = value;
            }
        }

        public List<SousCategorie> ListeSousCategorie
        {
            get 
            {
                if (listeSousCategorie == null)
                {
                    listeSousCategorie = (DictionnaireDonnees.ListeSousCategories.Where(sc => sc.CategorieParent.Equals(this))).ToList();
                }
                return listeSousCategorie; 
            }
        }

        static public List<Categorie> ChargerListe()
        {
            try
            {
                ObjectPersistent.CreerFichier(NOM_FICHIER_XML, "Categories");

                List<Categorie> ListeCategories = new List<Categorie>();
                XElement xelement = XElement.Load(NOM_FICHIER_XML);

                IEnumerable<XElement> categories = xelement.Elements();

                foreach (var categorie in categories)
                {
                    Categorie nouvelleCategorie = new Categorie(categorie.Element("identifiant").Value,
                                                                categorie.Element("description").Value);

                    ListeCategories.Add(nouvelleCategorie);
                }

                return ListeCategories;
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors du chargement des categories; " + e.Message, "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return null;
            }
        }

        public override void AttribuerIdentifiant()
        {
            if (this.identifiant == 0)
            {
                this.identifiant = DictionnaireDonnees.ListeCategories.OrderBy(sc => sc.Identifiant).Last().Identifiant + 1;
            }
        }

        public override string ToString()
        {
            return identifiant.ToString();
        }

        public override void Dispose()
        {
            listeSousCategorie = null;
            base.Dispose();
        }
    }
}
